package com.sefonsoft.dataanalysis.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * 动态获取对象
 * @author xgj
 *
 */
@Component
public class SpringContextHolder implements ApplicationContextAware {

	private static ApplicationContext applicationContext; 
	
	
	/**
	* 实现ApplicationContextAware接口的context注入函数, 将其存入静态变量.
	*/ 
	public void setApplicationContext(ApplicationContext applicationContext) { 
		SpringContextHolder.applicationContext = applicationContext; // NOSONAR 
	} 
	   
	/**
	* 取得存储在静态变量中的ApplicationContext.
	*/ 
	public static ApplicationContext getApplicationContext() { 
		checkApplicationContext(); 
		return applicationContext; 
	} 
	   
	/**
	* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
	*/ 
	@SuppressWarnings("unchecked") 
	public static <T> T getBean(String name) { 
		checkApplicationContext(); 
		return (T) applicationContext.getBean(name); 
	} 
	   
	/**
	* 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型.
	*/ 
	@SuppressWarnings("unchecked") 
	public static <T> T getBean(Class<T> clazz) { 
		checkApplicationContext(); 
		return (T) applicationContext.getBeansOfType(clazz); 
	} 
	   
	
    /**
     * 通过name,以及Clazz返回指定的Bean  
     * @return
     */
    public static <T> T getBean(String name,Class<T> clazz){  
        return getApplicationContext().getBean(name, clazz);  
    }  
    
	/**
	* 清除applicationContext静态变量.
	*/ 
	public static void cleanApplicationContext() { 
		applicationContext = null; 
	} 
	   
	private static void checkApplicationContext() { 
		if (applicationContext == null) { 
			throw new IllegalStateException(
					"applicaitonContext未注入,请在applicationContext.xml中定义SpringContextHolder"); 
		} 
	} 
}
